.TH std::fill_n 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::fill_n \- std::fill_n

.SH Synopsis
   Defined in header <algorithm>
   template< class OutputIt, class Size, class T         (constexpr since
   >                                                     C++20)
   OutputIt fill_n( OutputIt first, Size count,          (until C++26)
   const T& value );
   template< class OutputIt, class Size,

             class T = typename
   std::iterator_traits
                                                         (since C++26)
   <OutputIt>::value_type >
   constexpr OutputIt fill_n( OutputIt first,
   Size count,

                              const T& value );
   template< class ExecutionPolicy,

             class ForwardIt, class Size, class  \fB(1)\fP
   T >                                                                    \fI(since C++17)\fP
   ForwardIt fill_n( ExecutionPolicy&& policy,                            (until C++26)

                     ForwardIt first, Size
   count, const T& value );
   template< class ExecutionPolicy,
                                                     \fB(2)\fP
             class ForwardIt, class Size,
             class T = typename
   std::iterator_traits
                                                                          (since C++26)
   <OutputIt>::value_type >
   ForwardIt fill_n( ExecutionPolicy&& policy,

                     ForwardIt first, Size
   count, const T& value );

   1) Assigns the given value to the first count elements in the range beginning at
   first if count > 0. Does nothing otherwise.
   2) Same as \fB(1)\fP, but executed according to policy.
   This overload participates in overload resolution only if

   std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.        (until
                                                                             C++20)
   std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since
                                                                             C++20)

   If any of the following conditions is satisfied, the program is ill-formed:

     * value is not writable to first.
     * Size is not convertible to an integral type.

.SH Parameters

   first    -  the beginning of the range of elements to modify
   count    -  number of elements to modify
   value    -  the value to be assigned
   policy   -  the execution policy to use. See execution policy for details.
.SH Type requirements
   -
   OutputIt must meet the requirements of LegacyOutputIterator.
   -
   ForwardIt must meet the requirements of LegacyForwardIterator.

.SH Return value

   Iterator one past the last element assigned if count > 0, first otherwise.

.SH Complexity

   Exactly std::max(0, count) assignments.

.SH Exceptions

   The overload with a template parameter named ExecutionPolicy reports errors as
   follows:

     * If execution of a function invoked as part of the algorithm throws an exception
       and ExecutionPolicy is one of the standard policies, std::terminate is called.
       For any other ExecutionPolicy, the behavior is implementation-defined.
     * If the algorithm fails to allocate memory, std::bad_alloc is thrown.

.SH Possible implementation

                                   fill_n
   template<class OutputIt, class Size,
            class T = typename std::iterator_traits<OutputIt>::value_type>
   OutputIt fill_n(OutputIt first, Size count, const T& value)
   {
       for (Size i = 0; i < count; i++)
           *first++ = value;
       return first;
   }

.SH Notes

             Feature-test macro           Value    Std              Feature
   __cpp_lib_algorithm_default_value_type 202403 (C++26) List-initialization for
                                                         algorithms (1,2)

.SH Example


// Run this code

 #include <algorithm>
 #include <complex>
 #include <iostream>
 #include <iterator>
 #include <vector>

 int main()
 {
     std::vector<int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

     // replace values of the first 5 elements with -1
     std::fill_n(v1.begin(), 5, -1);

     std::copy_n(v1.cbegin(), v1.size(), std::ostream_iterator<int>(std::cout, " "));
     std::cout << '\\n';

     std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
     #ifdef __cpp_lib_algorithm_default_value_type
         std::fill_n(nums.begin(), 2, {4, 2});
     #else
         std::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
     #endif
     std::copy_n(nums.cbegin(), nums.size(),
                 std::ostream_iterator<std::complex<double>>(std::cout, " "));
     std::cout << '\\n';
 }

.SH Output:

 -1 -1 -1 -1 -1 5 6 7 8 9
 (4,2) (4,2) (4,8)

   Defect reports

   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.

     DR    Applied to           Behavior as published              Correct behavior
   LWG 283 C++98      T was required to be CopyAssignable, but  required to be writable
                      T is not always writable to OutputIt      instead
                      the complexity requirement was “exactly
   LWG 426 C++98      count                                     no assignment if
                      assignments”, which is broken if count is count is non-positive
                      negative
                      the location of the first element
   LWG 865 C++98      following                                 returned
                      the filling range was not returned

.SH See also

   fill           copy-assigns the given value to every element in a range
                  \fI(function template)\fP
   ranges::fill_n assigns a value to a number of elements
   (C++20)        (niebloid)
